<?php
/**
 * Classe déléguée aux actions
 *
 * @category librairies
 * @package sh
 *
 * @author Mickaël CASTANHEIRO
 * @version 1.0
 */
abstract class shAction extends shBase {

    /**
     * Constructeur de la classe
     */
    public function __construct() {
	$this->parameters = shRequest::__instance()->getArguments();
    }

    /**
     * Modifie le titre de la page en cours
     * @param <string> Titre
     */
    public function setTitle($_title) {
	shMoteur::__instance()->setTitle($_title);
    }

    /**
     * Renvoie le titre de la page en cours
     * @return <string> Titre
     */
    public function getTitle() {
	return shMoteur::__instance()->getTitle();
    }

    /**
     * Ajoute un lien sur le fil d'ariane
     * @param <string> Lien
     * @param <string> Description du lien
     */
    public function addAriane($_link, $_name) {
	shMoteur::__instance()->addAriane($_link, $_name);
    }

    /**
     * Ajoute un stylesheet au moteur
     * @param <string> Chemin vers le stylesheet
     */
    public function addStylesheet($_stylesheet) {
	shMoteur::__instance()->addStylesheet($_stylesheet);
    }

    /**
     * Ajoute un javascript au moteur
     * @param <string> Chemin vers le javascript
     */
    public function addJavascript($_javascript) {
	shMoteur::__instance()->addJavascript($_javascript);
    }

    /**
     * Assigne une variable courante au contexte
     * afin qu'elle soit accessible depuis d'autres actions ou templates
     * @param <string> Nom par lequel accéder à la variable
     * @param <mixed> Valeur de la variable
     */
    public function assign($_name, $_value) {
	shMoteur::__instance()->addData($_name, $_value);
    }

    /**
     * Redirige une page
     */
    public function redirect($_module=null, $_action=null, $_request=null, $_arguments=null, $_extension='html') {
	header('Location: ' . shRequest::link($_module, $_action, $_request, $_arguments, $_extension));
	exit;
    }


    /**
     *  Charge l'action associée à la requête
     */
    public static function load() {
        $request = shRequest::__instance();
        $moteur  = shMoteur::__instance();

        if ( $request->getMode() != 'ajax' AND $request->getModule() != shRequest::DEFAULT_MODULE) {
		$moteur->addJavascript('javascript/jquery.multicheck.js');
		$moteur->addJavascript('javascript/jquery.colorpicker.min.js');
		$moteur->addJavascript('javascript/jquery-ui.multiselect.min.js');
		$moteur->addJavascript('javascript/administration.js');

		$moteur->addStylesheet('css/jquery-multicheck/jquery-multicheck.css');
		$moteur->addStylesheet('css/jquery-colorpicker/jquery-colorpicker.css');
		$moteur->addStylesheet('css/jquery-ui-lightness/jquery-ui.multiselect.custom.css');
		$moteur->addStylesheet('css/styleAdmin.css');
		$moteur->addStylesheet('css/icon.css');
	    
        }


	return self::loadAction($request->getModule(), $request->getAction(), $request->getRequest(), $request->getArguments(), $request->getMode());
    }

    /**
     *  Charge l'action associée à la requête
     */
    public static function call($_module=null, $_action=null, $_request=null, $_arguments=null, $_extension='html') {
	$request = shRequest::__instance();
	$toReturn = null;
	ob_start();
	    readfile(shRequest::link($_module, $_action, $_request, $_arguments, $_extension));
	    $toReturn = ob_get_contents();
	ob_end_clean();
	return $toReturn;
    }


    /**
     * Charge une action depuis des paramètres
     * @param <string> Module
     * @param <string> Action
     * @param <string> Requête
     * @param <array> Paramètres de la requête
     * @param <string> Extension html|ajax
     */
    private static function loadAction($_module, $_action, $_request, $_arguments, $_extension) {
	// Inclue le traitement relatif à la requête
	$file = DIR_WEB . $_module . '/' .$_action .'.php';
	if ( !file_exists($file) ) {
	    throw new Exception('Le fichier '.$file.' est introuvable ('.$_module.'|'.$_action.'Action)', 404);
	    return false;
	}

	require_once $file;
	$actionName =$_action.'Action'; // Cherche le nom de l'action
	$action = new $actionName(); // Crée l'action

	// Appelle init() si existe
	if ( method_exists($action, 'init') )
	    $action->init();

	// Appelle execute...()
	$methodName = 'execute' . $_request;
	if ( !method_exists($action, $methodName) ) {
	    throw new Exception('La requête '.$_request.' est introuvable pour '.$file.' ('.$_module.'|'.$_module.'Action | '.$_request.')', 404);
	    return false;
	}


	// Récupère le droit du module/action/request
	// Sélectionne tous les droits pour le module, le module/action et le module/request et les classe
	if ( $droit = shSGBD::selectOne(
	'SELECT id, module, action, request '.
	'FROM droit '.
	'WHERE ( module=:module ) '.
	'AND ( action=:action OR action="" OR action IS NULL ) '.
	'AND ( request=:request OR request="" OR request IS NULL ) '.
	'ORDER BY module, action DESC, request DESC ',
	array(':module' => $_module,
	':action' => $_action,
	':request' => $_request)
	) ) {
	    // Si pas connecté, inaccessible
	    $session = shSession::__instance();

	    if ( !$session->isAuthenticated() OR !$session->isAuthorization($droit->module, $droit->action, $droit->request) ) {
		throw new Exception('Vous devez être connecté(e) pour accéder à cette page', 403);
		return false;
	    }
	}

	// Gestion des paramètres
	$arguments = &$_arguments;
	switch ( sizeof($arguments) ) {
	    case 1:
		return $action->$methodName($arguments[0]);
		break;
	    case 2:
		return $action->$methodName($arguments[0], $arguments[1]);
		break;
	    case 3:
		return $action->$methodName($arguments[0], $arguments[1], $arguments[2]);
		break;
	    case 4:
		return $action->$methodName($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
		break;
	    case 5:
		return $action->$methodName($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4]);
		break;
	    case 6:
		return $action->$methodName($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4], $arguments[5]);
		break;
	    case 7:
		return $action->$methodName($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4], $arguments[5], $arguments[6]);
		break;
	    case 8:
		return $action->$methodName($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4], $arguments[5], $arguments[6], $arguments[8]);
		break;
	    default:
		return $action->$methodName();
		break;
	}

    }
}
?>